package MyMath;

/**
 * 754. 到达终点数字
 *
 * 在一根无限长的数轴上，你站在0的位置。终点在target的位置。
 *
 * 每次你可以选择向左或向右移动。第 n 次移动（从 1 开始），可以走 n 步。
 *
 * 返回到达终点需要的最小移动次数。
 *
 * 示例 1:
 *
 * 输入: target = 3
 * 输出: 2
 * 解释:
 * 第一次移动，从 0 到 1 。
 * 第二次移动，从 1 到 3 。
 *
 * 示例 2:
 *
 * 输入: target = 2
 * 输出: 3
 * 解释:
 * 第一次移动，从 0 到 1 。
 * 第二次移动，从 1 到 -1 。
 * 第三次移动，从 -1 到 2 。
 */

/**
 * 因为轴对称，所以取绝对值统一往右移动
 * 计算当前步数能到达右边的所有位置
 * 1: 1
 * 2: 3, 1
 * 3: 6, 4, 2, 0
 * 4: 10, 8, 6, 4, 0
 * 5: 15, 13, 11, 9, 7, 5, 3, 1
 * 可以看出当前步能到达的位置相邻间隔2
 * 所以只需要找到最小的步数，满足他的最大位置>=target并且两者奇偶性相同即可
 */
public class Leetcode0754 {
    public int reachNumber(int target) {
        target=Math.abs(target);
        int maxPos=0;
        int steps=0;
        while (target>maxPos||(maxPos-target)%2!=0){
            steps++;
            maxPos += steps;
        }
        return steps;
    }
}
